package com.portal.annotation.aspect;

import com.alibaba.fastjson.JSON;
import com.portal.annotation.annotation.BuildObject;
import com.portal.annotation.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 日志切面处理类
 *
 * @author Amadeus
 * @date 2022/09/08
 */
@Slf4j
@Aspect
@Component
public class BuildAspect {

    public static User create() {
        User user = new User();

        // 获取User类中所有的方法（getDeclaredMethods也行）
        Method[] methods = User.class.getMethods();

        try {
            for (Method method : methods) {
                // 如果一个注解指定注解类型是存在于此元素上此方法返回true，否则返回false
                //参数 -- 对应于注解类型的Class对象
                if (method.isAnnotationPresent(BuildObject.class)) {
                    //此方法返回该元素的注解在此元素的指定注释类型（如果存在），否则返回null
                    BuildObject buildObject = method.getAnnotation(BuildObject.class);
                    // 如果Method代表了一个方法 那么调用它的invoke就相当于执行了它代表的这个方法,在这里就是给set方法赋值
                    method.invoke(user, buildObject.value());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        log.info("对象build after:{}", JSON.toJSONString(user));

        return user;
    }
}
